package com.sbl.controller;

import com.sbl.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 实际开发中，Spring和SpringMVC是分开配置的，
 * 我们一般将除了Controller之外的所有Bean注册到Spring容器中，将Controller注册到SpringMVC容器中（已经两个容器了）
 */

//控制器类
//扫描到该注解之后，生成对象，交给Spring容器管理

@Controller
@RequestMapping(path="/user")//也可以放在方法上，下面所有的方法的访问都要加上这个路径,用于模块化
public class HelloController {

    @Autowired
    HelloService helloService ;

    //SpringMVC的注解，当有请求来的时候，执行这个方法
    //默认可以通过get和post都可以请求到这个方法
    @RequestMapping(path="/hello")
    public String sayHello(){
        System.out.println("Hello SpringMVC");
        System.out.println(helloService.sayHello("小龙哥 ==》"));
        // 返回相当于跳转到success.jsp
        return "success";
    }

    //SpringMVC的注解，当有请求来的时候，执行这个方法(path和value是一样的)
    @RequestMapping(value="/requestMapping",method = {RequestMethod.GET,RequestMethod.POST})
    public String testRequestMapping(){
        System.out.println("requestMapping 执行到了");
        // 返回相当于跳转到success.jsp
        return "success";
    }

    //请求必须携带的参数及值（需要全匹配，如username=小龙）
    @RequestMapping(value="/requestMappingParams",params = {"username"})
    public String testRequestMappingParams(){
        System.out.println("requestMappingParams 执行到了");
        // 返回相当于跳转到success.jsp
        return "success";
    }

    //请求必须携带的参数及值（必须全匹配）;必须包含请求头
    @RequestMapping(value="/requestMappingParamsHeaders",params = {"username=小龙"},headers = {"Accept"})
    public String testRequestMappingParamsHeads(){
        System.out.println("必须包含请求头 执行到了");
        // 返回相当于跳转到success.jsp
        return "success";
    }
}

/**
 *  SpringMVC中的组件
 *  1. DispatcherServlet：前端控制器，用户的请求到达前端控制器，它相当于MVC中的C控制层，DispatcherServlet是整个流程的控制中心，相当于SpringMVC的大脑
 *      由它调用其他组件处理有用户的请求，DispatcherServlet的存在降低了组件之间耦合
 *  2. HandlerMapping： 处理器映射器，负责根据用户请求找到Handler即处理器（也就是我们说的Controller），提供了不同的映射器实现不同的映射方式，如配置文件，注解（常用）
 *  3. Handler：处理器，Handler是继Dispatcher前端控制器的后端控制器，Handler对用户的请求进行处理，由于Handler设计到具体的业务请求，所有需要开发多个Handler，这里
 *      我们提到的Handler就是指我们的Controller控制器
 *  4. HandlerAdapter：处理器适配器， 将查找到的Handler交给HandlerAdapter。通过扩展适配器可以对更多类型的处理器进行执行
 *  5. ViewResolver：视图解析器，ViewResolver负责将处理结果生成View视图
 *
 */
